#include <iostream>
#include <future>
#include <thread>

void Add(int x, int y, std::promise<int> &prom)
{
    prom.set_value(x + y);
    return;
}

// prom对象和普通的指针/引用的区别:
// 1. 它是线程安全的
// 2. prom对象配合future使用时可以在使用future::get()获得结果的时候, 进行线程同步;
// 3. 可用进行异常的捕获, 在执行过程中抛出异常，可以通过 std::promise::set_exception将异常设置到 std::future 中，并在调用 get() 时捕获该异常
// promise 和 async 很相似, 都可以在异步执行任务时拿到执行结果(异常捕捉)
// async只能传递最终的执行结果(返回值)
// promise 可以用来传递过程中的值(函数执行中的某个值, 自己设置), promise更适用于较为复杂的异步处理场景;

int main()
{
    // prom用来 "暂时存储" 线程执行任务的结果
    // 注意它是类似于一种信号的机制, 并不适合用来当中缓冲区使用
    std::promise<int> prom; 
    // prom.get_future() 返回一个future对象;
    std::future<int> fu = prom.get_future();
    // 创建线程去执行Add函数
    std::thread thr(Add, 11, 22, std::ref(prom));
    thr.join();
    int result = fu.get(); // 如果线程的任务没有完成就会阻塞到这里, 进行状态同步
    std::cout << result << std::endl;

    return 0;
}